/*
 * Mutex.h
 *
 */

#ifndef MUTEX_H_
#define MUTEX_H_

#include <pthread.h>

class Mutex {
	protected:
		pthread_mutex_t mutex;
	public:
		Mutex();
		virtual ~Mutex();

		/**
		 * Bloquea el mutex
		 */
		void lock();

		/**
		 * Desbloquea el Mutex
		 */
		void unlock();
};

/**
 * Permite la notificación de eventos entre hilos.
 * Extensión de la clase mutex.
 */

class ConditionVariable : public Mutex {
private:
	pthread_cond_t cv;
public:
	ConditionVariable();
	virtual ~ConditionVariable();

	/** Señaliza todos los wait de la Condition Variable.
	 * Es NECESARIO que la Condition Variable se encuentre bloqueada.
	 */
	void broadcast();

	/** Señaliza a un solo wait de la Condition Variable.
	 * Es NECESARIO que la Condition Variable se encuentre bloqueada.
	 */
	void signal();

	/** Espera la señalización de signal() o broadcast().
	 * Es NECESARIO que la Condition Variable se encuentre bloqueada.
	 * Se desbloquea automaticamente durante la espera.
	 */
	void wait();
};

/**
 * Misma funcionalidad del mutex pero al crear/eliminar.
 * evita el uso de las funciones lock, unlock
 * el objeto Lock
 */
class Lock {
	private:
		Mutex& mutex;
	public:
		/**
		 * Bloquea el mutex pasado como parametro
		 */
		explicit Lock(Mutex& mutex);

		/**
		 * Desbloquea el mutex al ser destruida Lock
		 */
		virtual ~Lock();
};

#endif /* MUTEX_H_ */
